/*
 * 资源注入过滤器 - 向页面注入CSS和JavaScript资源
 * 
 * 主要功能：
 * - 根据查询参数条件注入资源
 * - 演示资源管理器的使用
 * - 支持样式表和脚本的注册
 * - 提供动态资源加载机制
 */

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using OrchardCore.ResourceManagement;
using System.Threading.Tasks;

namespace Lombiq.TrainingDemo.Filters;

/// <summary>
/// 资源注入过滤器 - 向页面注入CSS和JavaScript资源
/// 
/// 主要用途：
/// - 根据查询参数条件注入资源
 /* - 演示资源管理器的使用
 * - 支持样式表和脚本的注册
 * - 提供动态资源加载机制
 * 
 * 使用场景：
 * - 根据URL参数动态加载样式表
 * - 实现页面淡入效果
 * - 条件性资源加载
 * - 演示资源管理的最佳实践
 * 
 * 设计原因：
 * - 提供动态资源加载机制
 * - 演示Orchard Core资源管理器的使用
 * - 实现条件性资源注入
 * - 提供可重用的资源管理功能
 * 
 * 设计模式：
 * - 过滤器模式：实现IAsyncResultFilter接口
 * - 依赖注入模式：通过构造函数注入服务
 * - 资源管理模式：使用IResourceManager注册资源
 * - 条件模式：根据查询参数决定是否注入资源
/// </summary>
// 不要忘记在Startup.cs文件中的过滤器集合中添加此过滤器。*/
public sealed class ResourceInjectionFilter : IAsyncResultFilter
{
    // 要注册资源，您可以使用IResourceManager服务。
    private readonly IResourceManager _resourceManager;

    /// <summary>
    /// 构造函数 - 注入资源管理器服务
    /// </summary>
    /// <param name="resourceManager">资源管理器，用于注册和管理资源</param>
    public ResourceInjectionFilter(IResourceManager resourceManager) => _resourceManager = resourceManager;

    /// <summary>
    /// 结果执行方法 - 在结果执行时注入资源
    /// 
    /// 功能说明：
    /// - 检查结果类型是否为PartialViewResult
    /// - 检查URL是否包含"fadeIn"查询参数
    /// - 根据条件注册样式表资源
    /// - 继续执行后续过滤器
    /// 
    /// 执行条件：
    /// - 不是部分视图结果
    /// - URL包含"fadeIn"查询参数
    /// 
    /// 使用示例：
    /// - 在任何页面URL后添加"?fadeIn"或"&fadeIn"
    /// - 观察页面淡入效果
    /// </summary>
    /// <param name="context">结果执行上下文</param>
    /// <param name="next">下一个执行委托</param>
    /// <returns>完成的任务</returns>
    public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
    {
        // 让我们决定何时执行过滤器。如果这是部分视图，注入资源就没有意义。
        // 这里还有一个如何检查请求是否包含"fadeIn"查询字符串参数的示例。
        // 只需打开任何页面并在URL中添加"?fadeIn"或"&fadeIn"，然后看看会发生什么！
        if (context.Result is PartialViewResult || !context.HttpContext.Request.Query.ContainsKey("fadeIn"))
        {
            await next();

            return;
        }

        // 您可以注册"stylesheet"或"script"资源。您还可以使用链接到RegisterResource()方法的
        // .AtHead()或.AtFoot()方法设置它们的渲染位置，这显然只有在资源是脚本时才有意义。
        _resourceManager.RegisterResource("stylesheet", "Lombiq.TrainingDemo.Filtered");

        await next();
    }
}

// 下一站：Filters/ResourceFromShapeInjectingFilter.cs
